package ManagedBeans;

import ComponenteDatos.AgenciaFacadeLocal;
import ComponenteDatos.EmpleadoFacadeLocal;
import ComponenteEntidad.Empleado;
import ComponenteDatos.PersonaFacadeLocal;
import ComponenteEntidad.Persona;
import ComponenteDatos.UsuarioFacadeLocal;
import ComponenteEntidad.Usuario;
import ComponenteEntidad.Agencia;
import ComponenteEntidad.Tipoempleado;
import ComponenteEntidad.Cargo;
import ComponenteEntidad.Cliente;
import ComponenteEntidad.Encomienda;
import ComponenteEntidad.Ventas;
import ComponenteEntidad.Viaje;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

@ManagedBean
@SessionScoped
public class ManagedBeanEmpleado implements  Serializable{
    @EJB
    private AgenciaFacadeLocal agenciaFacade;

    @EJB
    private EmpleadoFacadeLocal EmpleadoFacade;
    @EJB
    private PersonaFacadeLocal PersonaFacade;
    @EJB
    private UsuarioFacadeLocal UsuarioFacade;
    
    private Empleado objetoEmpleado;
    private Empleado objetoEmpleadoCrear;
    private Empleado objetoEmpleadoJefe;
    private Persona objetoPersona;
    private Usuario objetoUsuario;
    private Tipoempleado objetoTipoempleado;
    private Cargo objetoCargo;
    private Agencia objetoAgencia;
    private List<Empleado> lista;
    private List<SelectItem> objetoItems = new LinkedList<SelectItem>();
    private HashMap<Integer, Empleado> myobjeto = new HashMap<Integer, Empleado>();

    public ManagedBeanEmpleado() {
        objetoEmpleado = new Empleado();
        objetoEmpleado.setIdEmpleado(1);
        lista = new LinkedList<Empleado>();
        objetoEmpleadoCrear = new Empleado();
        objetoEmpleadoCrear.setEmpEstado(true);

        objetoPersona = new Persona();
        objetoTipoempleado = new Tipoempleado();
        objetoUsuario = new Usuario();
        objetoCargo = new Cargo();
        objetoAgencia = new Agencia();
        objetoEmpleadoJefe = new Empleado();
        
        objetoPersona.setPerApellidos("");
        objetoPersona.setPerCel("");
        objetoPersona.setPerDNI("");
        objetoPersona.setPerDireccion("");
        objetoPersona.setPerNombres("");
        objetoPersona.setPerTelf("");
//        objetoCargo.setCarDescripcion("");////mmmm no debe ser asi...!!
    }

    public List<SelectItem> getObjetoItems() {
        lista = new ArrayList<Empleado>();
        objetoItems = new LinkedList<SelectItem>();
        lista = EmpleadoFacade.findAll();
        for (Empleado p : lista) {
            if(/*p.getEmpleado().getPersona().getIdPersona()!=1 &&*/ p.getEmpEstado()==true){
                myobjeto.put(p.getIdEmpleado(), p);
                objetoItems.add(new SelectItem(p, p.getPersona().getPerNombres()+" "+p.getPersona().getPerApellidos()));
            }
        }
        return objetoItems;
    }
    public List<SelectItem> getObjetoItemsChofer() {
        lista = new ArrayList<Empleado>();
        objetoItems = new LinkedList<SelectItem>();
        lista = EmpleadoFacade.findAll();
        for (Empleado p : lista) {
            // SOLO CHOFERES EL TIPO EMPLEADO 1.
            if(/*p.getEmpleado().getPersona().getIdPersona()!=1 &&*/ p.getEmpEstado()==true && p.getTipoempleado().getIdTipoEmpleado()==1){
                myobjeto.put(p.getIdEmpleado(), p);
                objetoItems.add(new SelectItem(p, p.getPersona().getPerNombres()+" "+p.getPersona().getPerApellidos()));
            }
        }
        return objetoItems;
    }
    
    public List<SelectItem> getObjetoItemsVendedores() {
        lista = new ArrayList<Empleado>();
        objetoItems = new LinkedList<SelectItem>();
        lista = EmpleadoFacade.findAll();
        for (Empleado p : lista) {
            // SOLO CHOFERES EL TIPO EMPLEADO 1.
            if(/*p.getEmpleado().getPersona().getIdPersona()!=1 &&*/ p.getEmpEstado()==true && (p.getTipoempleado().getIdTipoEmpleado()==4) || p.getTipoempleado().getIdTipoEmpleado()==4){
                myobjeto.put(p.getIdEmpleado(), p);
                objetoItems.add(new SelectItem(p, p.getPersona().getPerNombres()+" "+p.getPersona().getPerApellidos()));
            }
        }
        return objetoItems;
    }

    public List<SelectItem> getObjetoItemsTerramosa() {
        lista = new ArrayList<Empleado>();
        objetoItems = new LinkedList<SelectItem>();
        lista = EmpleadoFacade.findAll();
        for (Empleado p : lista) {
            // SOLO CHOFERES EL TIPO EMPLEADO 1.
            if(/*p.getEmpleado().getPersona().getIdPersona()!=1 &&*/ p.getEmpEstado()==true && p.getTipoempleado().getIdTipoEmpleado()!=1){
                myobjeto.put(p.getIdEmpleado(), p);
                objetoItems.add(new SelectItem(p, p.getPersona().getPerNombres()+" "+p.getPersona().getPerApellidos()));
            }
        }
        return objetoItems;
    }
    public void setObjetoItems(List<SelectItem> objetoItems) {
        this.objetoItems = objetoItems;
    }

    public Empleado getObjetoEmpleadoJefe() {
        return objetoEmpleadoJefe;
    }

    public void setObjetoEmpleadoJefe(Empleado objetoEmpleadoJefe) {
        this.objetoEmpleadoJefe = objetoEmpleadoJefe;
    }

    public Agencia getObjetoAgencia() {
        return objetoAgencia;
    }

    public void setObjetoAgencia(Agencia objetoAgencia) {
        this.objetoAgencia = objetoAgencia;
    }

    public Cargo getObjetoCargo() {
        return objetoCargo;
    }

    public void setObjetoCargo(Cargo objetoCargo) {
        this.objetoCargo = objetoCargo;
    }

    public Persona getObjetoPersona() {
        return objetoPersona;
    }

    public void setObjetoPersona(Persona objetoPersona) {
        this.objetoPersona = objetoPersona;
    }

    public Usuario getObjetoUsuario() {
        return objetoUsuario;
    }

    public void setObjetoUsuario(Usuario objetoUsuario) {
        this.objetoUsuario = objetoUsuario;
    }

    public Tipoempleado getObjetoTipoempleado() {
        return objetoTipoempleado;
    }

    public void setObjetoTipoempleado(Tipoempleado objetoTipoempleado) {
        this.objetoTipoempleado = objetoTipoempleado;
    }

    public Empleado getObjetoEmpleado() {
        return objetoEmpleado;
    }

    public Empleado getObjetoEmpleado(int id) {
        return (Empleado) myobjeto.get(id);
    }

    public void setObjetoEmpleado(Empleado objetoEmpleado) {
        this.objetoEmpleado = objetoEmpleado;
    }

    public Empleado getObjetoEmpleadoCrear() {
        return objetoEmpleadoCrear;
    }

    public void setObjetoEmpleadoCrear(Empleado objetoEmpleadoCrear) {
        this.objetoEmpleadoCrear = objetoEmpleadoCrear;
    }

    public List<Empleado> getLista() {
        lista = new LinkedList<Empleado>();
        List<Empleado> listaTemporal = new LinkedList<Empleado>();
        listaTemporal = EmpleadoFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getEmpEstado() == true) {
                lista.add(listaTemporal.get(i));
            }
        }
        return lista;
    }

    public void setLista(List<Empleado> lista) {
        this.lista = lista;
    }

    public HashMap<Integer, Empleado> getMyobjeto() {
        return myobjeto;
    }

    public void setMyobjeto(HashMap<Integer, Empleado> myobjeto) {
        this.myobjeto = myobjeto;
    }

    public void insertar() {
        try {
            if (!verificarSiexiste(objetoPersona.getPerDNI())) {
                objetoEmpleadoCrear.setEmpEstado(true);
                objetoEmpleadoCrear.setEmpFechaIngreso(new Date());
                objetoEmpleadoCrear.setEmpFechaSalida(new Date());

                objetoEmpleadoCrear.setCargo(objetoCargo);
                objetoEmpleadoCrear.setTipoempleado(objetoTipoempleado);
                objetoEmpleadoCrear.setAgencia(objetoAgencia);
                objetoEmpleadoCrear.setEmpleado(objetoEmpleadoJefe);

                objetoPersona.setPerEstado(true);
                objetoPersona.setPerFechaCreacion(new Date());
                objetoPersona.setEmpleadoList(new LinkedList<Empleado>());
                objetoPersona.setClienteList(new LinkedList<Cliente>());
                objetoPersona.setPerTipo(2);

                objetoEmpleadoCrear.setEmpleadoList(new LinkedList<Empleado>());
                objetoEmpleadoCrear.setEncomiendaList(new LinkedList<Encomienda>());
                objetoEmpleadoCrear.setUsuarioList(new LinkedList<Usuario>());
                objetoEmpleadoCrear.setVentasList(new LinkedList<Ventas>());
                objetoEmpleadoCrear.setViajeList(new LinkedList<Viaje>());
                objetoEmpleadoCrear.setViajeList1(new LinkedList<Viaje>());
                objetoEmpleadoCrear.setViajeList2(new LinkedList<Viaje>());

                PersonaFacade.create(objetoPersona);
                objetoEmpleadoCrear.setPersona(objetoPersona);
                EmpleadoFacade.create(objetoEmpleadoCrear);

               //  recien creado el usuario sus credenciales son :
                objetoUsuario.setUsuLogin(objetoPersona.getPerDNI());
                objetoUsuario.setUsuPassword(objetoPersona.getPerDNI());
                objetoUsuario.setEmpleado(objetoEmpleadoCrear);
                objetoUsuario.setUsuEstado(true);

                UsuarioFacade.create(objetoUsuario);
                // vamos a agregar un nuevo empleado a la agencia.
                objetoAgencia.setAgenNroEmpleados(objetoAgencia.getAgenNroEmpleados()+1);
                agenciaFacade.edit(objetoAgencia);
                
                FacesMessage msg = new FacesMessage("Informacion", "Registro Ingresado");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                objetoEmpleadoCrear = new Empleado();
                objetoPersona = new Persona();
            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Ya Existe Empleado");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void editar() {
        try {
            EmpleadoFacade.edit(objetoEmpleado);
            PersonaFacade.edit(objetoEmpleado.getPersona());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void eliminar() {
        try {
             objetoAgencia.setAgenNroEmpleados(objetoAgencia.getAgenNroEmpleados()-1);
                agenciaFacade.edit(objetoAgencia);
            objetoEmpleado.setEmpEstado(false);
            EmpleadoFacade.edit(objetoEmpleado);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Empleado Seleccionado", ((Empleado) event.getObject()).getIdEmpleado().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Empleado No seleccionado", ((Empleado) event.getObject()).getIdEmpleado().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public boolean verificarSiexiste(String desc) {
        boolean existe = false;
        lista = new LinkedList<Empleado>();
        List<Empleado> listaTemporal = new LinkedList<Empleado>();
        listaTemporal = EmpleadoFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getPersona().getPerDNI().equalsIgnoreCase(desc) && listaTemporal.get(i).getEmpEstado() == true) {
                existe = true;
            }
        }

        return existe;
    }
}
